package com.sailing.xjpb.orm.intercepter;

import com.sailing.xjpb.common.sercurity.SailingUserContext;
import com.sailing.xjpb.orm.utils.JpaUtils;

import java.util.Date;

/**
 * 实体保存时，设置操作人信息
 */
public interface CrudRepositoryOperatorHandler {

    /**
     * 判断给定的实体是否为新实体
     * 新实体是指尚未分配唯一标识符（例如数据库主键）的实体
     * 此方法用于在执行持久化操作前确定实体的状态
     *
     * @param entity 要检查的实体对象
     * @return 如果实体是新实体，则返回true；否则返回false
     */
    default boolean isNewEntity(Object entity) {
        return JpaUtils.isNewEntity(entity);
    }

    /**
     * 设置操作人信息。
     *
     * @param entity      要设置操作人信息的实体对象
     * @param isNew       标记实体是否为新实体（未持久化）
     * @param userContext 当前用户的上下文信息
     */
    void setOperator(Object entity, boolean isNew, SailingUserContext userContext);

    /**
     * 设置实体对象的数据库时间字段
     * 此方法通过反射遍历实体对象的所有字段，寻找带有@LastModifiedBy注解的字段，并将其值设置为指定的数据库时间
     * 主要用于在实体对象持久化前，更新记录最后修改时间的字段
     *
     * @param entity    实体对象，其类型可以是任何类，但应包含带有@LastModifiedBy注解的字段
     * @param newEntity 指示实体对象是否为新创建的，未使用
     * @param dbTime    数据库时间，将被设置到实体对象中带有@LastModifiedBy注解的字段
     */
    void setDbTime(Object entity, boolean newEntity, Date dbTime);
}
